<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
<script>



//【示例1】使用arguments对象能够增强函数应用的灵活性。例如，如果函数的参数个数不确定，或者函数的参数个数很多，而又不想为每个参数都定义一个形参变量，此时可以省略参数，直接在函数体内使用arguments对象来访问调用函数的实参值。

function avg(){				// 求平均数
    var num = 0, l = 0; 		// 声明并初始化临时变量
    for(var i = 0; i < arguments.length; i ++ ){ 	// 遍历所有实参
        if(typeof arguments[i] != "number")			// 如果参数不是数值
            continue; 						// 则忽略该参数值
        num += arguments[i]; 				// 计算参数的数值之和
        l ++ ; 								// 计算参与和运算的参数个数
    }
    num /= l; 								// 求平均值
    return num; 							// 返平均值
}
alert(avg(1, 2, 3, 4)); 					// 返回2.5
alert(avg(1, 2, "3", 4)); 					// 返回2.3333333333333335
//【示例2】验证函数参数的合法性。在页面设计中经常需要验证表单输入值，下面示例检测文本框中输入的值是否为合法的邮箱地址。
function isEmail(){
    if(arguments.length>1) throw new Error("只能够传递一个参数");
	// 检测参数个数
    // 定义正则表达式
    var regexp = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+
((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; 
    if (arguments[0].search(regexp)!= -1) 	// 匹配实参的值
        return true;							// 如果匹配则返回true
    else
        return false; 						// 如果不匹配则返回false
}
var email = "zhuyinhong@css8.cn";			// 声明并初始化邮箱地址字符串
alert(isEmail(email)); 					// 返回true
//【示例3】可以通过使用arguments来模拟重载，其实现机制是通过判断arguments中实际参数的个数和类型来执行不同的逻辑。
function sayHello() {
    switch (arguments.length) {
        case 0:
            return "Hello";
        case 1:
            return "Hello, " + arguments[0];
        case 2:
            return (arguments[1] == "cn" ? " 你好，" : "Hello, ") + arguments[0];
    };
}
sayHello();//"Hello"
sayHello("Alex");// "Hello, Alex"
sayHello("Alex", "cn");	// " 你好，Alex"
//【示例4】callee是arguments对象的一个属性，其值是当前正在执行的function对象。它的作用是使匿名 function可以被递归调用。下面以一段计算斐波那契序列中第N个数的值的过程来演示arguments.callee的使用。
function fibonacci(num) {
    return (function(num) {
        if( typeof num !== "number")
            return -1;
        num = parseInt(num);
        if(num < 1)
            return -1;
        if(num == 1 || num == 2)
            return 1;
        return arguments.callee(num - 1) + arguments.callee(num - 2);
    })(num);
}
fibonacci(100)







</script>
</head>
<body>
</body>
</html>
